package com.rw.tool.util.io.file.property;

import java.util.List;
import java.util.stream.Collectors;

public abstract class IdGetterBeanParser<T, F> implements BeanParser<T> {
    private final IdListGetter<F> idListGetter;

    /**
     * 声明一个json的属性解析器
     *
     * @param idListGetter 自定义id属性获取
     */
    public IdGetterBeanParser(IdListGetter<F> idListGetter) {
        this.idListGetter = idListGetter;
    }

    @Override
    public FileBean<T> getFileBean(Class<T> tClass) {
        // 获取所有属性
        List<F> allField = getAllField(tClass);
        // 获取所有id的属性
        List<IdProperty<F>> idList = idListGetter.get(allField);

        // 把json封装为FileProperty接口
        List<FileProperty<T>> fileIdList = idList.stream()
                .map(id -> toFileProperty(id.getProperty(), id.isAutoIncrement()))
                .collect(Collectors.toList());

        List<FileProperty<T>> fileProperties = allField.stream()
                .map(id -> toFileProperty(id, false))
                .collect(Collectors.toList());

        // 构造bean属性返回
        return new FileBean<>(fileIdList, fileProperties);
    }

    /**
     * 获得所有属性
     *
     * @param tClass 类型
     * @return 所有属性的列表
     */
    protected abstract List<F> getAllField(Class<T> tClass);

    /**
     * 解析field的属性，封装为自定义的接口
     *
     * @param field 属性
     * @return 自定义的接口
     */
    protected abstract FileProperty<T> toFileProperty(F field, boolean autoIncrement);
}
